package main

import (
	"fmt"
	"math/rand"
	"os"
	"os/exec"
	"time"
)

/**
*  User: zhanbei
*  Date: 2025/10/27
*  Description: 爱心雨动画效果 - 从天而降的爱心
 */

// Heart 表示一个爱心
type Heart struct {
	x     int    // 横坐标
	y     int    // 纵坐标
	speed int    // 下落速度（每次更新移动的行数）
	char  string // 爱心字符
}

// 获取终端尺寸
func getTerminalSize() (width, height int) {
	cmd := exec.Command("stty", "size")
	cmd.Stdin = os.Stdin
	out, err := cmd.Output()
	if err != nil {
		return 80, 24 // 默认尺寸
	}
	fmt.Sscanf(string(out), "%d %d", &height, &width)
	return
}

// 清屏
func clearScreen() {
	fmt.Print("\033[2J")
}

// 移动光标到指定位置
func moveCursor(x, y int) {
	fmt.Printf("\033[%d;%dH", y, x)
}

// 隐藏光标
func hideCursor() {
	fmt.Print("\033[?25l")
}

// 显示光标
func showCursor() {
	fmt.Print("\033[?25h")
}

// 设置颜色
func setColor(color int) {
	fmt.Printf("\033[%dm", color)
}

// 重置颜色
func resetColor() {
	fmt.Print("\033[0m")
}

// 创建新的爱心
func newHeart(width, height int) *Heart {
	hearts := []string{"♥", "❤", "💕", "💖", "💗", "💓", "💝"}
	colors := []int{31, 35, 91, 95} // 红色系

	h := &Heart{
		x:     rand.Intn(width-2) + 1,
		y:     0,
		speed: rand.Intn(2) + 1,
		char:  hearts[rand.Intn(len(hearts))],
	}

	// 随机选择一个颜色
	setColor(colors[rand.Intn(len(colors))])

	return h
}

// 更新爱心位置
func (h *Heart) update() {
	h.y += h.speed
}

// 绘制爱心
func (h *Heart) draw() {
	if h.y > 0 {
		moveCursor(h.x, h.y)
		fmt.Print(h.char)
	}
}

// 清除爱心
func (h *Heart) clear() {
	if h.y > 0 {
		moveCursor(h.x, h.y)
		fmt.Print(" ")
	}
}

// 检查是否超出屏幕
func (h *Heart) isOffScreen(height int) bool {
	return h.y > height
}

// 爱心雨动画
func RunLove() {
	rand.Seed(time.Now().UnixNano())

	width, height := getTerminalSize()

	// 隐藏光标
	hideCursor()
	defer showCursor()

	// 清屏
	clearScreen()

	// 显示标题
	moveCursor(width/2-10, 1)
	setColor(95) // 亮粉色
	fmt.Print("💝 爱心雨 - 按 Ctrl+C 退出 💝")
	resetColor()

	hearts := make([]*Heart, 0)
	frameCount := 0

	// 设置信号处理，以便优雅退出
	done := make(chan bool)

	go func() {
		// 运行30秒后自动退出
		time.Sleep(30 * time.Second)
		done <- true
	}()

	// 动画主循环
	ticker := time.NewTicker(80 * time.Millisecond)
	defer ticker.Stop()

loop:
	for {
		select {
		case <-done:
			break loop
		case <-ticker.C:
			frameCount++

			// 每隔几帧创建新的爱心
			if frameCount%3 == 0 && len(hearts) < 50 {
				hearts = append(hearts, newHeart(width, height))
			}

			// 更新和绘制所有爱心
			newHearts := make([]*Heart, 0)
			for _, heart := range hearts {
				// 清除旧位置
				heart.clear()

				// 更新位置
				heart.update()

				// 如果还在屏幕内，绘制并保留
				if !heart.isOffScreen(height) {
					heart.draw()
					newHearts = append(newHearts, heart)
				}
			}
			hearts = newHearts

			resetColor()
		}
	}

	// 清屏并显示结束信息
	clearScreen()
	moveCursor(width/2-8, height/2)
	setColor(91)
	fmt.Println("💖 感谢观看！💖")
	resetColor()
	moveCursor(1, height)
	time.Sleep(1 * time.Second)
}
